%     AERO LOAD - программа для нагружения агрегатов самолета распределенной нагрузкой
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function Load_Summary = Load_Verification(Load)

global ErrCode;

global db_Next_Coord_Number;

global DB_NODES;
global DB_ELEMENTS;
global DB_COORD;

global AT_NODES;
global AT_COORD;

global ELEMENT_FORCES;
global ELEMENT_NORMAL_PROJECTIONS;

Load_Summary = [];

% Создание системы координат для суммирования нагрузок

Set_Next_Coord_Number();

Summation_Coord = DB_Coord_Create_Rect_3P(Load.Coord_Origin, Load.Point_On_Axis_3, Load.Point_On_Plane_13);

if (ErrCode < 0)
    fprintf (1, 'Работа программы завершена с ошибкой!\n\n');
    return;
end

db_Next_Coord_Number = db_Next_Coord_Number + 1;

% Вычисление узловых сил

fprintf (1, 'Вычисление узловых сил...                                 ');

NODE_FORCES = zeros(size(DB_NODES,1),3);

switch Load.Distributed_Load_Mode
    
    case 'CID_DISTR_LOAD'
        
        for i=1:size(DB_ELEMENTS,1)

            switch DB_ELEMENTS{i}.N_nodes

                case 3

                    Force = Load.Vector * ELEMENT_FORCES(i,1);

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) + (Force/3)';

                case 4

                    Force = Load.Vector * ELEMENT_FORCES(i,1);
                    
                    N1 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(1))}.Location;
                    N2 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(2))}.Location;
                    N3 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(3))}.Location;
                    N4 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(4))}.Location;
                    
                    Q1 = (N1 + N2)/2;
                    Q2 = (N2 + N3)/2;
                    Q3 = (N3 + N4)/2;
                    Q4 = (N4 + N1)/2;
                    
                    R = (Q1 + Q3)/2;
                    
                    S1 = Triangle_Area(N1, R, Q1) + Triangle_Area(N1, R, Q4);
                    S2 = Triangle_Area(N2, R, Q1) + Triangle_Area(N2, R, Q2);
                    S3 = Triangle_Area(N3, R, Q2) + Triangle_Area(N3, R, Q3);
                    S4 = Triangle_Area(N4, R, Q3) + Triangle_Area(N4, R, Q4);
                    
                    S = S1 + S2 + S3 + S4;

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) + (Force * S1/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) + (Force * S2/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) + (Force * S3/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) + (Force * S4/S)';

                case 6

                    Force = Load.Vector * ELEMENT_FORCES(i,1);

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) + (Force/3)';

                case 8

                    Force = Load.Vector * ELEMENT_FORCES(i,1);

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(7)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(7)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(8)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(8)),:) + (Force/3)';

                otherwise

                    ErrCode = -1;
                    fprintf (1, '\nНедопустимое количество узлов [%i] у элемента с номером %i типа %s !\n', DB_ELEMENTS{i}.N_nodes, DB_ELEMENTS{i}.ID, DB_ELEMENTS{i}.type);
                    return;

            end

        end
        
    case 'PRESSURE'
        
        for i=1:size(DB_ELEMENTS,1)

            switch DB_ELEMENTS{i}.N_nodes

                case 3
                    
                    if (ELEMENT_NORMAL_PROJECTIONS(i,1) == 0)
                        Force = [0;0;0];
                    else
                        Element_Normal = Get_Shell_Normal(DB_ELEMENTS{i}.ID);
                        Force = Element_Normal / ELEMENT_NORMAL_PROJECTIONS(i,1) * ELEMENT_FORCES(i,1);
                    end

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) + (Force/3)';

                case 4

                    if (ELEMENT_NORMAL_PROJECTIONS(i,1) == 0)
                        Force = [0;0;0];
                    else
                        Element_Normal = Get_Shell_Normal(DB_ELEMENTS{i}.ID);
                        Force = Element_Normal / ELEMENT_NORMAL_PROJECTIONS(i,1) * ELEMENT_FORCES(i,1);
                    end
                    
                    N1 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(1))}.Location;
                    N2 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(2))}.Location;
                    N3 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(3))}.Location;
                    N4 = DB_NODES{AT_NODES(DB_ELEMENTS{i}.Nodes(4))}.Location;
                    
                    Q1 = (N1 + N2)/2;
                    Q2 = (N2 + N3)/2;
                    Q3 = (N3 + N4)/2;
                    Q4 = (N4 + N1)/2;
                    
                    R = (Q1 + Q3)/2;
                    
                    S1 = Triangle_Area(N1, R, Q1) + Triangle_Area(N1, R, Q4);
                    S2 = Triangle_Area(N2, R, Q1) + Triangle_Area(N2, R, Q2);
                    S3 = Triangle_Area(N3, R, Q2) + Triangle_Area(N3, R, Q3);
                    S4 = Triangle_Area(N4, R, Q3) + Triangle_Area(N4, R, Q4);
                    
                    S = S1 + S2 + S3 + S4;

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) + (Force * S1/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) + (Force * S2/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) + (Force * S3/S)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) + (Force * S4/S)';

                case 6

                    if (ELEMENT_NORMAL_PROJECTIONS(i,1) == 0)
                        Force = [0;0;0];
                    else
                        Element_Normal = Get_Shell_Normal(DB_ELEMENTS{i}.ID);
                        Force = Element_Normal / ELEMENT_NORMAL_PROJECTIONS(i,1) * ELEMENT_FORCES(i,1);
                    end

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) + (Force/3)';

                case 8

                    if (ELEMENT_NORMAL_PROJECTIONS(i,1) == 0)
                        Force = [0;0;0];
                    else
                        Element_Normal = Get_Shell_Normal(DB_ELEMENTS{i}.ID);
                        Force = Element_Normal / ELEMENT_NORMAL_PROJECTIONS(i,1) * ELEMENT_FORCES(i,1);
                    end

                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(1)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(2)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(3)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(4)),:) - (Force/12)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(5)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(6)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(7)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(7)),:) + (Force/3)';
                    NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(8)),:) = NODE_FORCES(AT_NODES(DB_ELEMENTS{i}.Nodes(8)),:) + (Force/3)';

                otherwise

                    ErrCode = -1;
                    fprintf (1, '\nНедопустимое количество узлов [%i] у элемента с номером %i типа %s !\n', DB_ELEMENTS{i}.N_nodes, DB_ELEMENTS{i}.ID, DB_ELEMENTS{i}.type);
                    return;

            end

        end
    
end

fprintf (1, 'OK!\n');

% Фактическая результирующая сила

fprintf (1, 'Вычисление результирующей силы...                         ');

Actual_Total_Force_Vector = sum(NODE_FORCES,1)';
Actual_Total_Force = norm(Actual_Total_Force_Vector);

Actual_Total_Force_Pn = dot(Actual_Total_Force_Vector, Load.Vector);
Actual_Total_Force_Pn_Vector = Actual_Total_Force_Pn * Load.Vector;

Actual_Total_Force_Pt_Vector = Actual_Total_Force_Vector - Actual_Total_Force_Pn_Vector;
Actual_Total_Force_Pt = norm(Actual_Total_Force_Pt_Vector);

FX = dot(Actual_Total_Force_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_x);
FY = dot(Actual_Total_Force_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_y);
FZ = dot(Actual_Total_Force_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_z);

fprintf (1, 'OK!\n');

% Фактический результирующий момент

fprintf (1, 'Вычисление результирующего момента...                     ');

Actual_Total_Moment_Vector = zeros(3,1);

for i=1:size(NODE_FORCES,1)
    Actual_Total_Moment_Vector = Actual_Total_Moment_Vector + cross(DB_NODES{i}.Location - Load.Summation_Point, NODE_FORCES(i,:)');
end

Actual_Total_Moment = norm(Actual_Total_Moment_Vector);

MX = dot(Actual_Total_Moment_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_x);
MY = dot(Actual_Total_Moment_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_y);
MZ = dot(Actual_Total_Moment_Vector, DB_COORD{AT_COORD(Summation_Coord)}.e_z);

fprintf (1, 'OK!\n');

% Теоретический центр давления (декартовы координаты проекции)

Pressure_Center_XYZ_Projected = [];

if (~isempty(Load.Precomputed_Data.Chord_Pressure_Center))
    Pressure_Center_XYZ_Projected = Get_Cartesian_Coord(Load.Chord_Surface.A1_projected, ...
                                                        Load.Chord_Surface.A2_projected, ...
                                                        Load.Chord_Surface.A3_projected, ...
                                                        Load.Chord_Surface.A4_projected, ...
                                                        Load.Precomputed_Data.Span_Pressure_Center, ...
                                                        Load.Precomputed_Data.Chord_Pressure_Center);
end

% Фактический центр давления

if (strcmp(Load.Distributed_Load_Mode, 'PRESSURE'))
    fprintf (1, 'Вычисление фактического центра давления нагрузки Pn...    ');
else
    fprintf (1, 'Вычисление фактического центра давления...                ');
end

Tmp_sum = zeros(3,1);

for i=1:size(NODE_FORCES,1)
    Tmp_sum = Tmp_sum + DB_NODES{i}.Location * dot(NODE_FORCES(i,:)', Load.Vector);
end

Actual_Pressure_Center_XYZ = Tmp_sum / Actual_Total_Force_Pn;
Actual_Pressure_Center_XYZ_Projected = Project_Point_To_Plane(Actual_Pressure_Center_XYZ, Load.Basic_Plane.Equation);

Actual_Pressure_Center_ksi = Get_Param_Coord(Load.Chord_Surface.A1_projected, ...
                                             Load.Chord_Surface.A2_projected, ...
                                             Load.Chord_Surface.A3_projected, ...
                                             Load.Chord_Surface.A4_projected, ...
                                             Actual_Pressure_Center_XYZ_Projected);

Actual_Pressure_Center_etta = Get_Param_Coord(Load.Chord_Surface.A1_projected, ...
                                              Load.Chord_Surface.A3_projected, ...
                                              Load.Chord_Surface.A2_projected, ...
                                              Load.Chord_Surface.A4_projected, ...
                                              Actual_Pressure_Center_XYZ_Projected);

fprintf (1, 'OK!\n');

% Вывод статистики по нагрузкам
if (strcmp(Load.Distributed_Load_Mode, 'PRESSURE'))
    fprintf(1, '\nСуммарная сила по нормали к базовой плоскости (Pn):\n');
else
    fprintf(1, '\nСуммарная сила по нормали к базовой плоскости:\n');
end
fprintf(1, '\n    Теоретическая: \t%.5f\n', Load.Pn);
fprintf(1, '    Фактическая: \t%.5f\n', Actual_Total_Force_Pn);
fprintf(1, '    Отклонение: \t%.3f%%\n', (Actual_Total_Force_Pn/Load.Pn - 1)*100);

if (strcmp(Load.Distributed_Load_Mode, 'PRESSURE'))
    fprintf(1, '\nСуммарная сила в базовой плоскости (Pt):\n');
    fprintf(1, '\n    Фактическая: \t%.5f\n', Actual_Total_Force_Pt);
end

if (strcmp(Load.Distributed_Load_Mode, 'PRESSURE'))
    fprintf(1, '\nЦентр давления нагрузки Pn:\n');
else
    fprintf(1, '\nЦентр давления:\n');
end

fprintf(1, '                                              Теор. знач.     Факт. знач.     Относ. откл.\n');

fprintf(1, '    Параметрическая координата по размаху:\t\t%.5f\t\t\t%.5f\t\t\t%.3f%%\n', Load.Precomputed_Data.Span_Pressure_Center, Actual_Pressure_Center_ksi, (Actual_Pressure_Center_ksi/Load.Precomputed_Data.Span_Pressure_Center - 1)*100);

if (~isempty(Load.Precomputed_Data.Chord_Pressure_Center))
    fprintf(1, '    Параметрическая координата по хорде:\t\t%.5f\t\t\t%.5f\t\t\t%.3f%%\n', Load.Precomputed_Data.Chord_Pressure_Center, Actual_Pressure_Center_etta, (Actual_Pressure_Center_etta/Load.Precomputed_Data.Chord_Pressure_Center - 1)*100);
else
    fprintf(1, '    Параметрическая координата по хорде:\t\t  ---  \t\t\t%.5f\t\t\t  ---  \n', Actual_Pressure_Center_etta);
end

if (~isempty(Load.Precomputed_Data.Chord_Pressure_Center))
    
    fprintf(1, '\n                                              Теор. знач.     Факт. знач.     Абсол. откл.\n');
    fprintf(1, '    Проекция на базовую плоскость, X:\t\t\t%.5f\t\t%.5f\t\t%.5f\n', Pressure_Center_XYZ_Projected(1), Actual_Pressure_Center_XYZ_Projected(1), Pressure_Center_XYZ_Projected(1)-Actual_Pressure_Center_XYZ_Projected(1));
    fprintf(1, '    Проекция на базовую плоскость, Y:\t\t\t%.5f\t\t%.5f\t\t%.5f\n', Pressure_Center_XYZ_Projected(2), Actual_Pressure_Center_XYZ_Projected(2), Pressure_Center_XYZ_Projected(2)-Actual_Pressure_Center_XYZ_Projected(2));
    fprintf(1, '    Проекция на базовую плоскость, Z:\t\t\t%.5f\t\t%.5f\t\t%.5f\n', Pressure_Center_XYZ_Projected(3), Actual_Pressure_Center_XYZ_Projected(3), Pressure_Center_XYZ_Projected(3)-Actual_Pressure_Center_XYZ_Projected(3));
    
else
    
    fprintf(1, '\n');
    fprintf(1, '    Проекция на базовую плоскость, X:\t\t\t%.5f\n', Actual_Pressure_Center_XYZ_Projected(1));
    fprintf(1, '    Проекция на базовую плоскость, Y:\t\t\t%.5f\n', Actual_Pressure_Center_XYZ_Projected(2));
    fprintf(1, '    Проекция на базовую плоскость, Z:\t\t\t%.5f\n', Actual_Pressure_Center_XYZ_Projected(3));
    
end

fprintf(1, '\nФактические результирующие нагрузки:\n');

fprintf(1, '\n    Суммарная сила: \t%.5f\n', Actual_Total_Force);
fprintf(1, '\n    Fx: \t%.5f\n', FX);
fprintf(1, '    Fy: \t%.5f\n', FY);
fprintf(1, '    Fz: \t%.5f\n', FZ);

fprintf(1, '\n    Суммарный момент: \t%.5f\n', Actual_Total_Moment);
fprintf(1, '\n    Mx: \t%.5f\n', MX);
fprintf(1, '    My: \t%.5f\n', MY);
fprintf(1, '    Mz: \t%.5f\n', MZ);

% Заполнение структуры Load_Summary

Load_Summary.Summation_Coord = Summation_Coord;

Load_Summary.Actual_Total_Force_Pn = Actual_Total_Force_Pn;
Load_Summary.Actual_Total_Force_Pn_Vector = Actual_Total_Force_Pn_Vector;

Load_Summary.Actual_Total_Force_Pt = Actual_Total_Force_Pt;
Load_Summary.Actual_Total_Force_Pt_Vector = Actual_Total_Force_Pt_Vector;

Load_Summary.Actual_Total_Force = Actual_Total_Force;
Load_Summary.Actual_Total_Force_Vector = Actual_Total_Force_Vector;

Load_Summary.Actual_Total_Moment = Actual_Total_Moment;
Load_Summary.Actual_Total_Moment_Vector = Actual_Total_Moment_Vector;

Load_Summary.Pressure_Center_XYZ_Projected = Pressure_Center_XYZ_Projected;
Load_Summary.Pressure_Center_ksi = Load.Precomputed_Data.Span_Pressure_Center;
Load_Summary.Pressure_Center_etta = Load.Precomputed_Data.Chord_Pressure_Center;

Load_Summary.Actual_Pressure_Center_XYZ = Actual_Pressure_Center_XYZ;
Load_Summary.Actual_Pressure_Center_XYZ_Projected = Actual_Pressure_Center_XYZ_Projected;
Load_Summary.Actual_Pressure_Center_ksi = Actual_Pressure_Center_ksi;
Load_Summary.Actual_Pressure_Center_etta = Actual_Pressure_Center_etta;
